package cn.faifai.common.exception;

/**
 * 业务异常
 */

/**
 * 在Java中，错误（Error）类是一个预定义的类，它是所有错误（即异常情况，但通常指更严重的问题）的超类。
 * Java的异常处理机制使用三种主要类型来区分不同性质的问题：检查型异常（Checked Exceptions）、
 * 运行时异常（Runtime Exceptions）和错误（Errors）。其中，错误（Errors）代表Java运行时环境的内部错误
 * 或资源耗尽的情况，它们通常是无法恢复的。
 *
 * 这里关注的是运行时异常
 *  检查型异常：这些异常必须在方法签名中声明，调用者必须处理（捕获或再次声明抛出）这些异常。它们通常是可以预见的，并且程序应该对这些情况有所准备。调用者不处理就无法通过编译
 *  非检查型异常：包括运行时异常和错误。运行时异常通常是编程错误的结果（如数组越界、空指针引用等），
 *  常见检查性异常：
 *      SQLException
 *      SQL异常
 *      IOException
 *      IO异常，在对流操作时有可能会出现的异常
 *      FileNotFoundException
 *      找不到某个文件时，会抛出该异常
 *      ClassNotFoundException
 *      找不到某个类时，会抛出该异常
 *      EOFException
 *      输入过程中意外地到达文件尾或流尾，会抛出该异常，常见于对流的操作
 *  常见运行时异常：
 *      NullPointerException
 *      空指针异常，JAVA8中可用Optional来避免，一般是代码中出现了空对象时，抛出该异常
 *      IndexOutOfBoundsException
 *      数组下标越界异常，当使用的数组下标超出数组允许范围时，抛出该异常
 *      ClassCastException
 *      类型转换异常，当试图将对象强制转换为不是实例的子类时，抛出该异常
 *      NumberFormatException
 *      数字格式化异常，当试图将一个String转换为指定的数字类型，而该字符串确不满足数字类型要求的格式时，抛出该异常
 *      JSONException
 *      JSON异常，进行JSON格式化操作时出现异常，会抛出该异常
 *      原文链接：https://blog.csdn.net/qq_37917691/article/details/108797561
 * 在Java中，自定义一个运行时错误通常意味着创建一个继承自RuntimeException或其子类的类。RuntimeException
 * 及其子类都是非检查型异常，它们不需要在方法签名中显式声明，并且通常用于指示编程错误或运行时问题，这些问题虽然严重，
 * 但不一定表示JVM遇到了无法恢复的状态。如果继承自Exception或其子类的类,则是检查型异常.
 */
public class ServiceException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    /**
     * 错误码
     */
    private Integer code;

    /**
     * 错误提示
     */
    private String message;

    /**
     * 错误明细，内部调试错误
     */
    private String detailMessage;
    /**
     * 空构造方法，避免反序列化问题
     */
    public ServiceException() {
    }

    public ServiceException(String message) {
        this.message = message;
    }

    public ServiceException(String message, Integer code) {
        this.message = message;
        this.code = code;
    }

    public String getDetailMessage() {
        return detailMessage;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public Integer getCode() {
        return code;
    }

    public ServiceException setMessage(String message) {
        this.message = message;
        return this;
    }

    public ServiceException setDetailMessage(String detailMessage) {
        this.detailMessage = detailMessage;
        return this;
    }
}
